package com.util;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;

public class CsvUtil {
    final static Logger logger = LoggerFactory.getLogger(CsvUtil.class);

    //获取sys.properties的路径
    final static String propFile=GetAbsolutePath.getAbsPath("src/main/resources/sys.properties");//本地路径
    public static String format = "yyyy年MM月dd日";
    public static String DATE_FORMAT = "yyyy年MM月dd日";
    public static String DATE_FORMAT1 = "yyyy-MM-dd";
    public static String DATE_FORMAT2 = "yyyy-MM-dd HH:mm:ss.SSS";
    public static String DATE_FORMAT3 = "yyyy-MM-dd HH:mm:ss";
    public static String DATE_FORMAT4 = "yyyyMMdd";
    public static String DATE_FORMAT5 = "yyyyMM";
    public static String DATE_FORMAT6 = "MM-dd";//月日
    public static String DATE_FORMAT7 = "yyyyMMddHHmmss";
    public static String DATE_FORMAT8 = "MM-dd HH:mm:ss";
    public static Properties prop = null;


    //根据键获取值 ，在文件"src/main/resources/sys.properties"中  propFile
    public static String getSysProperty(String name) {
        if (prop == null) {
            prop = new Properties();
        }
        InputStreamReader reader = null;
        FileInputStream input = null;
        try {
            input = new FileInputStream(new File(propFile+""));
            reader = new InputStreamReader(input);
            prop.load(reader); // 文件流的编码方式
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                if (input != null){
                    input.close();
                }
                if (reader != null){
                    reader.close();
                }
            }catch (IOException e){
                e.printStackTrace();
            }
        }
        String v = prop.getProperty(name);
        logger.info(name+"="+v);
        return v;
    }


    /**
     * 使用指定的格式来格式化日期。默认格式为<b>yyyy年MM月dd日</b>
     * 需要格式化的日期。
     * 指定日期的格式化字符串。如果为空字符串或者null，则使用默认的格式来
     * 格式化日期。
     *
     * @return 格式化后的日期字符串。如果date为null，则返回空字符串。
     */
    public static String formatDate(Date date, String formatString){

        String result = "";
        SimpleDateFormat sdf = null;

        try{

            if ((formatString == null) || (formatString.length() <= 0)){
                formatString = format;
            }

            sdf = new SimpleDateFormat(formatString);
            result = sdf.format(date);

        }catch (Exception e){
            result = "";

        }finally{

        }
        return result;
    }


//没加入到项目
    //###########################################################################################
    /**
     * 根据指定的字符串格式，解析字符串并生成日期对象。
     *
     * @param parseString
     * 需要解析的字符串。
     *
     * @param formatString
     * 指定的字符串格式。
     *
     * @return 根据指定的字符串格式生成的日期对象。如果parseString为空字符串或者null，
     * 返回日期对象为null。如果formatString为空字符串或者null，则使用默认日期格式解析。
     */
    public static Date parseDate(String parseString, String formatString){

        Date result = null;
        SimpleDateFormat sdf = null;

        try{
            if ((parseString != null) && (parseString.length() > 0)){ //paesrString是正确的，准备解析

                if ((formatString == null) || (formatString.length() <= 0)){ //没有指定格式，使用默认格式。
                    formatString = format;
                }

                sdf = new SimpleDateFormat(formatString);
                result = sdf.parse(parseString);
            }

        }catch (Exception e){
            e.printStackTrace();
            result = null;

        }finally{

        }

        return result;
    }













    //16进制的转成对应数
    public static String[] convertHexToBigDecimal(String data) {
        int solidLen = "55AA4023".length();
        String[] arrayString = new String[64 * 20]; // 64个通道，每个通道20个测温点
        double[] arrayDouble = new double[64 * 20];
        int index = 0;// 温度点索引
        for (int i = solidLen; i < 64 * 20 * 4 + solidLen; i += 4)// 64通道x20个测温点x4个16进制
        {
            String str = data.substring(i, i + 4);//获取一个16进制的字符串
            // 调换位置 d407变化为07d4
            String hex = str.substring(2) + str.substring(0, 2);// 2,3位置和1,2位置交换

            // 若数据为7FFF，表示无效点。 将温度设为-50.99;
            if (StringUtils.equalsIgnoreCase("7FFF", hex)) {
                // LogService.info("无效点");
                arrayString[index] = "";// 将温度点数据设置为空
            } else {

                //调试数据
//                String s="07d4".substring(0);
//                Integer x = Integer.parseInt(s, 16);//2004
//                BigDecimal origin = new BigDecimal(x);//2004
//                BigDecimal now = new BigDecimal(100);//100
//
//                BigDecimal t = origin.divide(now, 2, RoundingMode.HALF_UP);//20.04
//
//				/*double t = (new BigDecimal(x.doubleValue())).divide(
//						new BigDecimal(100), 2).doubleValue();*/
//                //logger.info(t);
//                double y = t.doubleValue();//20.04
                //############################################################################
                //String s=hex.substring(1);
                // public String substring(int beginIndex)包括起始
                //public String substring(int beginIndex, int endIndex)
                String s=hex.substring(0);//07d4
                Integer x = Integer.parseInt(s, 16);
                BigDecimal origin = new BigDecimal(x);
                BigDecimal now = new BigDecimal(100);

                BigDecimal t = origin.divide(now, 2, RoundingMode.HALF_UP);

				/*double t = (new BigDecimal(x.doubleValue())).divide(
						new BigDecimal(100), 2).doubleValue();*/
                //logger.info(t);
                arrayString[index] = t + "";
                arrayDouble[index] = t.doubleValue();
            }
            index++;
        }
        return arrayString;
    }

    /**
     * 写文件
     *
     * @param fileName
     */
    public static void writeFileForCsv(String fileName, String[] str)
            throws Exception {
        // 第一步：设置输出的文件路径
        // 如果该目录下不存在该文件，则文件会被创建到指定目录下。如果该目录有同名文件，那么该文件将被覆盖。
        File tempFilePath = new File(fileName);
        if (tempFilePath.exists() == false) {// 文件不存在创建文件
            tempFilePath.getParentFile().mkdirs();
            tempFilePath.createNewFile();
        }
        try {
            // 第二步：通过BufferedReader类创建一个使用默认大小输出缓冲区的缓冲字符输出流
            BufferedWriter writeText = new BufferedWriter(new FileWriter(
                    tempFilePath, true));
            // 第三步：将文档的下一行数据赋值给lineData，并判断是否为空，若不为空则输出
            StringBuffer content = new StringBuffer();
            for (int i = 0; i < str.length; i++) {
                if (i == 0) {
                    content.append(str[i]);
                } else {
                    content.append("," + str[i]);
                }
            }
            writeText.write(content.toString());
            writeText.newLine(); // 换行
            // 使用缓冲区的刷新方法将数据刷到目的地中
            writeText.flush();
            // 关闭缓冲区，缓冲区没有调用系统底层资源，真正调用底层资源的是FileWriter对象，缓冲区仅仅是一个提高效率的作用
            // 因此，此处的close()方法关闭的是被缓存的流对象
            writeText.close();
        } catch (Exception e) {
            logger.info("没有找到指定文件");
            e.printStackTrace();
        }
    }

    /**
     * 根据路径获取文件内容，路径是rootPath和deviceNo的拼接
     * @param rootPath
     * @param deviceNo
     * @return
     * @throws Exception
     */
    public static String getPath(String rootPath, String deviceNo)
            throws Exception {
        StringBuffer path = new StringBuffer(rootPath);
        path.append("/" + deviceNo);
        path.append("/" + formatDate(new Date(), DATE_FORMAT4) + ".csv");//
        File file = new File(path.toString());
        if (file.exists()) {
            return path.toString();
        } else {
            file.getParentFile().mkdirs();
            file.createNewFile();
            return path.toString();
        }
    }


    //[3]方法或类注释
    //在一个方法或类的开头，输入/**，然后按回车,自动根据参数和返回值生成注释模板，我们在这个模板上面编写即可
    //按Ctrl+Shift+/注释掉该块代码
    /**
     * 根据路径获取文件内容
     * @param path
     * @return
     * @throws Exception
     */
    public static String getFileContent(String path)
            throws Exception {
        BufferedReader in =null;
        try {
            BufferedInputStream bis = new BufferedInputStream(
                    //new FileInputStream(new File("F:/outsourcing/1.3.数芯智能/11.上线/接受的数据/原始数据/00011133000000000002/20190129_温度数据.csv")));
                    new FileInputStream(path));
            in = new BufferedReader(new InputStreamReader(bis,
                    "utf-8"), 10 * 1024 * 1024);// 10M缓存
            StringBuffer str=new StringBuffer();
            while (in.ready()) {
                String line = in.readLine();
                str.append(line);
            }
            in.close();
            return str.toString();
        } catch (Exception e) {
            e.printStackTrace();
            return "";
        }
    }

    /**
     * 写文件内容，根据路径写数据到文件
     * @param path
     * @param content
     * @param append
     */
    public static void writeFileContent(String path,String content,boolean append){
        try {
            FileWriter fw = new FileWriter(path,append);
            fw.write(content);
            fw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}